package com.ic.base;


import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Part;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * Description: 控制层基类，提供操作结果成功/失败信息
 * Author: zen_hu
 * Date  : 2017/1/23
 * Time  : 14:42
 */
public class BaseController {
	public static final Logger LOGGER = Logger.getLogger(BaseController.class);

	/**
	 * 前端提交的请示处理成功，返回用map封装的状态信息和操作成功信息
	 *
	 * @param map  用于封装返回的信息
	 * @param type 操作类型：包含添加、修改、删除、查询、文件上传
	 * @param msg  操作结果信息
	 * @return Map结果信息
	 */
	public Map success(Map<String, Object> map, OperatorType type, String msg) {
		map.put(MessageInfo.CODE, MessageInfo.CODE_FOR_SUCCESS);
		return successMsg(map, type, msg);
	}

	/**
	 * 前端提交的请示处理失败，返回用map封装的状态信息和操作失败信息
	 *
	 * @param map  用于封装返回的信息
	 * @param type 操作类型：包含添加、修改、删除、查询、文件上传
	 * @param msg  操作结果信息
	 * @return Map结果信息
	 */
	public Map failed(Map<String, Object> map, OperatorType type, String msg) {
		map.put(MessageInfo.CODE, MessageInfo.CODE_FOR_FAILED);
		return failedMsg(map, type, msg);
	}

	/**
	 * 前端提交的请示处理成功，返回用map封装操作成功信息
	 *
	 * @param map  用于封装返回的信息
	 * @param type 操作类型：包含添加、修改、删除、查询、文件上传
	 * @param msg  操作结果信息
	 * @return Map结果信息
	 */
	public Map successMsg(Map<String, Object> map, OperatorType type, String msg) {
		if (Objects.nonNull(msg))
			map.put(MessageInfo.MSG, msg);
		else {
			if (type.equals(OperatorType.ADD))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_ADD_SUCCESS);
			else if (type.equals(OperatorType.DELETE))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_DELETE_SUCCESS);
			else if (type.equals(OperatorType.UPDATE))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_MODIFY_SUCCESS);
			else if (type.equals(OperatorType.SELECT))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_SELECT_SUCCESS);
			else if (type.equals(OperatorType.UPLOAD))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_UPLOAD_SUCCESS);
		}
		return map;
	}

	/**
	 * 前端提交的请示处理失败，返回用map封装操作失败信息
	 *
	 * @param map  用于封装返回的信息
	 * @param type 操作类型：包含添加、修改、删除、查询、文件上传、异常
	 * @param msg  操作结果信息
	 * @return Map结果信息
	 */
	public Map failedMsg(Map<String, Object> map, OperatorType type, String msg) {
		if (Objects.nonNull(msg)) {
			map.put(MessageInfo.MSG, msg);
		} else {
			if (type.equals(OperatorType.ADD))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_ADD_FAILED);
			else if (type.equals(OperatorType.DELETE))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_DELETE_FAILED);
			else if (type.equals(OperatorType.UPDATE))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_MODIFY_FAILED);
			else if (type.equals(OperatorType.SELECT))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_SELECT_FAILED);
			else if (type.equals(OperatorType.UPLOAD))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_UPLOAD_FAILED);
			else if (type.equals(OperatorType.ERROR))
				map.put(MessageInfo.MSG, MessageInfo.MSG_FOR_ERROR);
		}
		return map;
	}

	/**
	 * 本方法用于处理控制层及控制层调用所产生的异常，异常将被写入日志，同时返回失败信息给前端
	 *
	 * @param e 由控制层及控制层调用所产生的异常信息
	 * @return Map结果信息
	 */
	@ExceptionHandler(Exception.class)
	@ResponseBody
	public Map<String, Object> exceptionHandler(Exception e) {
		LOGGER.error(MessageInfo.MSG_FOR_ERROR, e);
		Map<String, Object> map = new HashMap();
		failed(map, OperatorType.ERROR, null);
		return map;
	}

	protected String getFileName(final Part part) {
		final String partHeader = part.getHeader("content-disposition");
		for (String content : part.getHeader("content-disposition").split(";")) {
			if (content.trim().startsWith("filename")) {
				return content.substring(
						content.indexOf('=') + 1).trim().replace("\"", "");
			}
		}
		return null;
	}
}
